use crate::commands::vx::init::init_wechat_check;
use crate::commands::vx_path::path_tools::init_db;
use tauri::ipc::Invoke;
use tauri::Wry;

/// 命令入口
mod commands;

/// Tauri 应用程序异步入口
///
/// 负责初始化全局状态、数据库连接，并启动 Tauri 应用。
///
/// ### 执行顺序
/// 1. 初始化微信运行状态（`init_wechat_check()`）。
/// 2. 初始化数据库连接和表（`init_db().await`）。
/// 3. 构建 Tauri 应用：
///    - 注册插件（`tauri_plugin_opener`）。
///    - 注册前端可调用命令（`invoke_handler`）。
/// 4. 启动 Tauri 应用并等待事件循环。
///
/// ### 异步说明
/// - `init_db()` 为异步操作，因此整个入口函数标记为 `async`。
/// - `init_wechat_check()` 内部使用异步任务执行微信运行状态检测，但不阻塞主线程。
///
/// ### 错误处理
/// - 若 Tauri 应用启动失败，会触发 `expect` 并 panic。
///
/// ### 示例
/// ```rust
/// // 程序启动时调用
/// run().await;
/// ```
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub async fn run() {
    // 初始化微信运行状态（异步任务执行）
    init_wechat_check();

    // 初始化数据库及表结构
    init_db().await;

    // 启动 Tauri 应用
    tauri::Builder::default()
        .plugin(tauri_plugin_opener::init()) // 注册插件
        .invoke_handler(get_invoke_handler()) // 注册前端可调用命令
        .run(tauri::generate_context!())      // 启动事件循环
        .expect("运行 tauri 应用程序时出错");
}

/// 获取 Tauri 命令处理器
///
/// 此函数用于将 Rust 后端函数注册为前端可调用命令（`invoke`）。
/// 注册的函数可以在前端通过 `window.__TAURI__.invoke` 调用。
///
/// ### 返回值
/// - 返回一个闭包，实现 `Fn(Invoke<Wry>) -> bool + Send + Sync + 'static`。
///
/// ### 已注册命令
/// | 命令名 | 对应函数 | 功能说明 |
/// |--------|-----------|----------|
/// | vx_run | `vx_run` | 启动微信多开实例 |
/// | get_vx_running | `get_vx_running` | 获取微信运行状态 |
/// | save_wechat_path_to_db | `save_wechat_path_to_db` | 保存或更新微信路径 |
///
/// ### 示例
/// ```rust
/// // 前端调用示例
/// const result = await window.__TAURI__.invoke("vx_run", { num: 2 });
/// console.log(result.message);
/// ```
fn get_invoke_handler() -> impl Fn(Invoke<Wry>) -> bool + Send + Sync + 'static {
    use crate::commands::vx::run_vx::vx_run;
    use crate::commands::vx::is_vx_running::get_vx_running;
    use crate::commands::vx_path::path_tools::save_wechat_path_to_db;

    // 使用 Tauri 宏注册命令
    tauri::generate_handler![
        vx_run,
        get_vx_running,
        save_wechat_path_to_db
    ]
}
